package com.shujia.scala

object Demo30Iimplicit {
  def main(args: Array[String]): Unit = {

    /**
      * 隐式转换  -- 隐式类型转换
      *
      * 显示转换 --- 显示类型转换
      *
      */

    val s: String = "1000"

    //显示类型转换
    val i: Int = s.toInt


    def fun(str: String): Unit = {
      println("fun:" + str)
    }

    fun("java")

    //显示类型转换
    fun(100.toString)


    /**
      * implicit ： 定义隐式转换的关键字
      *
      * 1、隐式转换方法
      * 可以将当前作用域中所有的参数类型的变量转换成返回值类型
      *
      * 隐式转换方法和方法名无关
      * 和参数类型，返回值类型有关
      *
      * 再同一个作用域中只能存在一个参数类型和返回值类型一样的隐式转换方法
      *
      */

    implicit def intToString(i: Int): String = {
      println("intToString")
      i.toString
    }

    implicit def doubleToString(d: Double): String = {
      d.toString
    }


    fun(1000)
    //相当于
    //fun(intToString(1000))

    fun(3.14)


    /**
      * 隐式转换的作用   -- 可以动态的给对象增加新的方法
      * scala中的String 和java中的String是同一个
      * 为什么scala中的String有toInt ,toDouble
      * 因为scala会隐式的将String转换成StringLike
      *
      */

    val ii: Int = "100".toInt


  }

}
